#!/usr/bin/env python
# Create: 2018/12/3
__author__ = '749B'

import argparse

from backend.config_parser import Config


def download(args):
    node = args.node
    conf_obj = Config(r'config/hosts.conf')
    nodes = conf_obj.config.sections()
    if node is None:
        print("缺少 主机名(node) 参数，可选的主机如下:")
        for n in nodes:
            print("\t", n)
        return
    if args.startswith:
        conf = [(n, conf_obj.get_conf(n)) for n in nodes if n.startswith(node)]
    else:
        conf = conf_obj.get_conf(node)
    if not conf:
        print("不存在该主机:", node)
        print("有效的主机列表:", nodes)
        return
    if not isinstance(conf, list):
        conf = [(node, conf), ]
    from backend.sub_cmd.sftp import SFTPClient
    for c in conf:
        client = SFTPClient(node=c[0], **c[1])
        client.main()


def file_engine(args):
    if args.init:
        print("使用初始化模式: 会导入旧的文件，删库重来时使用")
        print("效果：处理所有的文件，不忽略后缀，没有后缀的正常加上")
        ok = input("注意: 之前已经入库的数据，会再次重复录入。请确认（y）:")
        if ok not in ['y', 'Y', 'yes']:
            return
    from backend.sub_cmd.file_engine import main
    main(init=args.init)


def add_host(args):
    node = args.node
    conf_obj = Config(r'config/hosts.conf')
    conf = conf_obj.get_or_create_conf(node)
    from backend.sub_cmd.add_host import AddClient
    client = AddClient(conf_obj, **conf)
    client.main()


def test(args):
    from backend.sub_cmd.test_msg import main
    main(args)


def show_hosts(args):
    node = args.node
    conf_obj = Config(r'config/hosts.conf')
    if node:
        resp = conf_obj.get_conf(node)
        if resp:
            print("节点信息:", node)
            for k, v in resp.items():
                print("%s: %s" % (k, v))
            return
        print("未找到指定的主机名:", node)
    nodes = conf_obj.config.sections()
    print("所有节点如下:")
    for n in nodes:
        print("\t", n)


def parse_args():
    parser = argparse.ArgumentParser(description='SDS Log Audit 命令行工具')
    subparsers = parser.add_subparsers(help='子命令说明')

    parser_download = subparsers.add_parser('download', aliases=['down'], help='下载日志文件')  # 定义一个子命令
    parser_download.set_defaults(func=download)  # 设置默认参数，这个子命令里都会有这些参数。
    parser_download.add_argument('node', help="主机名", nargs='?')  # 不提供主机名，就打印所有可选的主机
    parser_download.add_argument('-s', '--startswith', action='store_true',
                                 help="匹配前缀，批量处理")

    parser_file = subparsers.add_parser('file_engine', aliases=['file'], help='解析文件入库')  # 这里还定义了别名
    parser_file.set_defaults(func=file_engine)
    parser_file.add_argument('-i', '--init', action='store_true',
                             help="初始化模式：会导入旧的文件，删库重来时使用")

    parser_add = subparsers.add_parser('add_host', aliases=['add'], help="部署新的主机")
    parser_add.set_defaults(func=add_host)
    parser_add.add_argument('node', help="主机名")

    parser_test = subparsers.add_parser('test_msg', aliases=['msg'], help="生成测试的日志消息入库")
    parser_test.set_defaults(func=test)
    parser_test.add_argument('-c', '--count', help="指定生成的记录数", default=1, type=int)
    parser_test.add_argument('-H', '--host', help="指定host字段", default="Test-Server")
    parser_test.add_argument('-s', '--severity', help="指定severity字段", default="ERR")
    parser_test.add_argument('-f', '--facility', help="指定facility字段", default="user")
    parser_test.add_argument('-p', '--process', help="指定syslog-tag字段", default="test:")
    parser_test.add_argument('-m', '--message', help="指定message字段", default="AUTO TEST MSG")

    # 这里的show定义了二级子命令
    parser_show = subparsers.add_parser('show', help="查询信息")
    parser_show.set_defaults(func='show')
    subparsers_show = parser_show.add_subparsers(help="查询命令说明")
    parser_show_hosts = subparsers_show.add_parser('hosts', aliases=['host'], help="查询主机")
    parser_show_hosts.set_defaults(func=show_hosts)
    parser_show_hosts.add_argument('node', help="主机名", nargs='?')  # show主机列表或某个主机的详细信息
    return parser


def main():
    parser = parse_args()
    args = parser.parse_args()
    if not hasattr(args, 'func'):
        parser.print_help()
        parser.exit()
    func = getattr(args, 'func')
    if callable(func):
        func(args)
    elif isinstance(func, str):
        parser.parse_args([func, '-h'])
    else:
        raise UserWarning("进入了意料之外的分支")


if __name__ == '__main__':
    parser = parse_args()
    args = parser.parse_args(['conn', 'host1'])  # 文档里都是这样在IDLE里调用测试的
    print(args)
    dic_args = vars(args)  # 把 Namespace 转成字典
    func = dic_args.pop('func')  # 获取字典的的这个值，并且从字典里删除
    print(dic_args)
    func(**dic_args)

    args = parser.parse_args(['ping', 'host1', 'host2', 'host3'])
    dic_args = vars(args)
    func = dic_args.pop('func')
    print(dic_args)
    func(**dic_args)


